﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using NUnit.Framework;
using Spring.Context;
using Studio7i.CapaDominio;
using Studio7i.CapaNegocio;
using Spring.Context.Support;
using Studio7i.CapaPersistencia;

namespace Studio7i.CapaPruebas.Pruebas_Negocio
{
    [TestFixture]
    public class PruebasClienteService
    {
        IApplicationContext Spring = null;
        IClienteService Service = null;
        Cliente clienteRegistrado = null;

        [TestFixtureSetUp]
        public void PrepararPruebas()
        {
            // Inicialización del contenedor de objetos de Spring.NET
            Spring = new XmlApplicationContext(
                "assembly://Studio7i/Studio7i/CapaPersistencia.xml",
                "assembly://Studio7i/Studio7i/CapaNegocio.xml"
                );
            // Obtención de la referencia al objeto "clienteService"
            Service = (IClienteService)Spring.GetObject("ClienteService");            
        }

        /*****************************************************************************************/
        /*****************************************************************************************/


        /*****************************************************************************************/
        /****Pruebas para la entidad Cliente******/
        [Test]
        public void Test_RegistrarCliente_DatosInsuficientes()
        {
            // Probamos que se lance la excepción porque pasamos "null" en clave
            Assert.Catch<DatosInsuficientesException>(delegate
            {
                Service.RegistrarCliente(67899908, "Juan Jose Velasquez Guerrero","pollo123@gmail.com","06/12/1987","1234",null);
            });
        }
        [Test]
        public void Test_RegistrarCliente_Ok()
        {
            // Probamos que no exista error en el registro de cliente
            Assert.DoesNotThrow(delegate
            {
                clienteRegistrado = Service.RegistrarCliente(67899908, "Juan Jose Velasquez Guerrero", "pollo123@gmail.com", "06/12/1987", "1234", "1234");
            });
            // Verificamos que el cliente registrado no sea nula
            Assert.IsNotNull(clienteRegistrado);
            // Verificamos que las demás propiedades grabadas sean iguales a las solicitadas
            Assert.AreEqual(clienteRegistrado.CoCliente, 67899908);
            Assert.AreEqual(clienteRegistrado.NoCliente, "Juan Jose Velasquez Guerrero");
            Assert.AreEqual(clienteRegistrado.TxMail, "pollo123@gmail.com");
            Assert.AreEqual(clienteRegistrado.FeNacimiento, "06/12/1987");
            Assert.AreEqual(clienteRegistrado.TxtClave, "1234");
        }
        [Test]
        public void Test_RegistrarCliente_Repetido()
        {
            // Probamos que se lance la excepción de cliente repetido colocando el mismo codigo
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                Service.RegistrarCliente(67899908, "Jose Enrique Blanca Principe", "joseblanca12@gmail.com", "05/11/1981", "1234", "1234");
            });
            // Probamos que se lance la excepción de cliente repetido colocando el mismo email
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                Service.RegistrarCliente(43566784, "Jose Enrique Blanca Principe", "pollo123@gmail.com", "05/11/1981", "1234", "1234");
            });
        }
        [Test]
        public void Test_RegistrarCliente_ClavesNoCoinciden()
        {
            // Probamos que se lance la excepción de cliente repetido colocando el mismo codigo
            Assert.Catch<DatosNoCoincidanException>(delegate
            {
                Service.RegistrarCliente(1, "Jose Enrique Blanca Principe", "joseblanca12@gmail.com", "05/11/1981", "4321", "1234");
            });
           
        }

        /*****************************************************************************************/
        /****Pruebas para la entidad Sala******/
        [Test]
        public void Test_BusquedaDeSala_ResultadoVacio()
        {
            Assert.Catch<ResultadoVacioException>(delegate
            {
                Service.BusquedaDeSala("Salsa Brava", null, null, null, null, null, null);
            });
        }
        [Test]
        public void Test_BusquedaDeSala_Ok()
        {
            ICollection<Sala> salasEncontradas = null;
            // Probamos que no exista error en la busqueda de sala
            Assert.DoesNotThrow(delegate
            {
                salasEncontradas = Service.BusquedaDeSala("E43A Rocks!", null, null, null, null, null, null);
            });
            // Verificamos que no sea nula
            Assert.IsNotNull(salasEncontradas);
        }
        /*[TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            // Eliminamos la sala inscrita
            ((IClienteDAO)Spring.GetObject("ClienteDAO")).Eliminar(clienteRegistrado);
            // Cerramos el contenedor de Spring
            Spring.Dispose();
            Spring = null;
        }*/
       

    }
}
